package com.eudon.design_pattern.behavioral.visitor;

/**
 * @author eudon
 * @description Word文件类 - 访问者模式中的具体元素
 * @date 2025/9/3
 * @email syd19970616@gmail.com
 * @address <a href="https://gitee.com/eudon">Gitee</a>
 */
public class WordFile extends ResourceFile {
    /**
     * Word文件的字数
     */
    private int wordCount;
    
    /**
     * 是否包含表格
     */
    private boolean hasTables;
    
    /**
     * 是否包含图片
     */
    private boolean hasImages;
    
    /**
     * 文档版本（如：Word 2019, Word 365等）
     */
    private String version;
    
    /**
     * 构造函数
     * @param fileName 文件名
     * @param fileSize 文件大小
     * @param wordCount 字数
     * @param hasTables 是否包含表格
     * @param hasImages 是否包含图片
     * @param version 文档版本
     */
    public WordFile(String fileName, long fileSize, int wordCount, boolean hasTables, boolean hasImages, String version) {
        super(fileName, fileSize);
        this.wordCount = wordCount;
        this.hasTables = hasTables;
        this.hasImages = hasImages;
        this.version = version;
    }
    
    /**
     * 接受访问者 - 实现双分派机制
     * 这里调用visitor.visit(this)，将当前Word文件对象传递给访问者
     * 访问者会根据参数类型（WordFile）选择对应的visit方法执行
     * 
     * @param visitor 访问者对象
     */
    @Override
    public void accept(Visitor visitor) {
        // 第二次分派：调用访问者的visit方法，传入当前Word文件对象
        visitor.visit(this);
    }
    
    @Override
    public String getFileType() {
        return "Word";
    }
    
    /**
     * 获取字数
     * @return 字数
     */
    public int getWordCount() {
        return wordCount;
    }
    
    /**
     * 是否包含表格
     * @return true表示包含表格，false表示不包含
     */
    public boolean hasTables() {
        return hasTables;
    }
    
    /**
     * 是否包含图片
     * @return true表示包含图片，false表示不包含
     */
    public boolean hasImages() {
        return hasImages;
    }
    
    /**
     * 获取文档版本
     * @return 文档版本
     */
    public String getVersion() {
        return version;
    }
    
    /**
     * 获取Word文件的特殊属性信息
     * @return 属性信息字符串
     */
    public String getWordInfo() {
        return String.format("字数: %d, 表格: %s, 图片: %s, 版本: %s", 
                           wordCount, hasTables ? "有" : "无", hasImages ? "有" : "无", version);
    }
    
    @Override
    public String toString() {
        return super.toString() + " - " + getWordInfo();
    }
}